package org.xxpay.agent.common.ctrl;

import org.springframework.web.bind.annotation.*;
import org.xxpay.core.common.domain.I18nBizResponse;
import org.xxpay.core.common.util.I18nUtil;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

/**
 * 国际化控制器 - 代理商系统
 * 提供语言切换和国际化消息获取功能
 * 
 * @author xxpay
 */
@RestController
@RequestMapping("/api/i18n")
public class I18nController {

    /**
     * 切换语言
     * 
     * @param lang 语言代码 (zh_CN, en_US)
     * @param request HTTP请求
     * @param response HTTP响应
     * @return 切换结果
     */
    @PostMapping("/switch")
    public I18nBizResponse switchLanguage(@RequestParam String lang,
                                         HttpServletRequest request,
                                         HttpServletResponse response) {
        try {
            // 验证语言代码
            if (!"zh_CN".equals(lang) && !"en_US".equals(lang)) {
                return I18nBizResponse.error("language.not.supported");
            }
            
            // 设置当前语言
            I18nUtil.setCurrentLocale(lang);
            
            // 设置Cookie
            javax.servlet.http.Cookie cookie = new javax.servlet.http.Cookie("xxpay_locale", lang);
            cookie.setPath("/");
            cookie.setMaxAge(365 * 24 * 60 * 60); // 1年
            response.addCookie(cookie);
            
            Map<String, Object> data = new HashMap<>();
            data.put("locale", lang);
            data.put("message", I18nUtil.getMessage("language.switch.success"));
            
            return I18nBizResponse.success(data, "language.switch.success");
        } catch (Exception e) {
            return I18nBizResponse.error("language.switch.failed");
        }
    }

    /**
     * 获取当前语言
     * 
     * @return 当前语言信息
     */
    @GetMapping("/current")
    public I18nBizResponse getCurrentLanguage() {
        try {
            String currentLocale = I18nUtil.getCurrentLocale();
            
            Map<String, Object> data = new HashMap<>();
            data.put("locale", currentLocale);
            data.put("name", getLanguageName(currentLocale));
            data.put("supportedLocales", getSupportedLocales());
            
            return I18nBizResponse.success(data);
        } catch (Exception e) {
            return I18nBizResponse.error("system.error");
        }
    }

    /**
     * 获取支持的语言列表
     * 
     * @return 支持的语言列表
     */
    @GetMapping("/languages")
    public I18nBizResponse getSupportedLanguages() {
        try {
            Map<String, Object> data = new HashMap<>();
            data.put("languages", getSupportedLocales());
            data.put("current", I18nUtil.getCurrentLocale());
            
            return I18nBizResponse.success(data);
        } catch (Exception e) {
            return I18nBizResponse.error("system.error");
        }
    }

    /**
     * 获取国际化消息
     * 
     * @param key 消息键
     * @param args 参数（可选）
     * @return 国际化消息
     */
    @GetMapping("/message")
    public I18nBizResponse getMessage(@RequestParam String key,
                                     @RequestParam(required = false) String[] args) {
        try {
            String message = I18nUtil.getMessage(key, (Object[]) args);
            Map<String, Object> data = new HashMap<>();
            data.put("key", key);
            data.put("message", message);
            data.put("locale", I18nUtil.getCurrentLocale());
            
            return I18nBizResponse.success(data);
        } catch (Exception e) {
            return I18nBizResponse.error("message.not.found");
        }
    }

    /**
     * 批量获取国际化消息
     * 
     * @param keys 消息键列表
     * @return 国际化消息映射
     */
    @PostMapping("/messages")
    public I18nBizResponse getMessages(@RequestBody String[] keys) {
        try {
            Map<String, String> messages = new HashMap<>();
            for (String key : keys) {
                messages.put(key, I18nUtil.getMessage(key));
            }
            
            Map<String, Object> data = new HashMap<>();
            data.put("messages", messages);
            data.put("locale", I18nUtil.getCurrentLocale());
            
            return I18nBizResponse.success(data);
        } catch (Exception e) {
            return I18nBizResponse.error("messages.load.failed");
        }
    }

    /**
     * 获取支持的语言列表
     * 
     * @return 语言列表
     */
    private Map<String, String> getSupportedLocales() {
        Map<String, String> locales = new HashMap<>();
        locales.put("zh_CN", "中文");
        locales.put("en_US", "English");
        return locales;
    }

    /**
     * 获取语言名称
     * 
     * @param locale 语言代码
     * @return 语言名称
     */
    private String getLanguageName(String locale) {
        switch (locale) {
            case "zh_CN":
                return "中文";
            case "en_US":
                return "English";
            default:
                return locale;
        }
    }
}
